% !TeX spellcheck = de_DE
\documentclass[UTF8,a4paper]{book} %设为A4纸
\usepackage{geometry}
\geometry{left=2cm,right=3cm,top=4cm,bottom=3cm} %设置页边距
\usepackage{amsfonts}
\usepackage{amssymb}
\usepackage{amsmath}
\usepackage{multicol}
\usepackage{verbatim}  %use verbatim
\usepackage{ctex}
\usepackage{ifthen}
\usepackage{makeidx}

\usepackage{listings}%code
\lstset{ %
	backgroundcolor=\color{white},   % choose the background color; you must add \usepackage{color} or 
	basicstyle=\footnotesize,        % the size of the fonts that are used for the code
	breakatwhitespace=false,         % sets if automatic breaks should only happen at whitespace
	breaklines=true,                 % sets automatic line breaking
	captionpos=bl,                    % sets the caption-position to bottom
	deletekeywords={...},            % if you want to delete keywords from the given language
	escapeinside={\%*}{*)},          % if you want to add LaTeX within your code
	extendedchars=true,              % lets you use non-ASCII characters; for 8-bits encodings only, does not work with 
	frame=single,                    % adds a frame around the code
	keepspaces=true,                 % keeps spaces in text, useful for keeping indentation of code (possibly needs 
	morekeywords={*,...},            % if you want to add more keywords to the set
	numbers=left,                    % where to put the line-numbers; possible values are (none, left, right)
	numbersep=5pt,                   % how far the line-numbers are from the code
	showspaces=false,                % show spaces everywhere adding particular underscores; it overrides 
	showstringspaces=false,          % underline spaces within strings only
	showtabs=false,                  % show tabs within strings adding particular underscores
	stepnumber=1,                    % the step between two line-numbers. If it's 1, each line will be numbered
	tabsize=2,                       % sets default tabsize to 2 spaces
}

\usepackage{fancyhdr}
\pagestyle{fancy}
\fancyfoot[LO,RE]{V2.0}

\usepackage{xcolor}
\colorlet{lightcyan}{cyan!40!white}

%\usepackage{chngcntr}
\usepackage{stackengine}

\usepackage{tasks}

\newlength{\longestlabel}

\settowidth{\longestlabel}{\bfseries viii.}

\usepackage[lastexercise]{exercise}
%\counterwithin{Exercise}{chapter}
%\counterwithin{Answer}{chapter}

%\renewcounter{Exercise}[chapter]

\setlength{\QuestionIndent}{7em}

\usepackage{enumerate}

\newboolean{printanswer}

%---------------------答案格式开始定义-----------------------------------------
%判断题后面加括号
\newcommand{\pd}[2][1]{\nolinebreak\dotfill\mbox{\raisebox{-1.8pt}
		{$\cdots$}(\makebox[#1 cm][c]{
			\ifthenelse{\boolean{printanswer}}
			{\ifthenelse{\equal{#2}{t}}{\Checkmark}{\XSolid}}
			{}
		})}}


%填空题画线  \tk
%\newcommand{\tk}[2][2.5]{\; \underline{\hspace{#1 cm} \hphantom{#2} \hspace{#1 cm} } \, }
\usepackage{ulem}
\newcommand{\tk}[2][0.5]{\;\uline{ 
		\hspace*{#1 cm}
		\ifthenelse{\boolean{printanswer}}{#2}{\hphantom{#2}}  
		\hspace*{#1 cm}
} }
%简答题  \jd
\newcommand{\jd}[2][4]{\par
	%\begin{minipage}[t][#1cm][t]{0.92\linewidth}	
	\ifthenelse{\boolean{printanswer}}{
		\begin{Answer}
			答：\par
			#2
		\end{Answer}
	}
	{}  
	%\end{minipage} 
}	
%---------------------------答案格式结束定义---------------------------------
\usepackage[breaklinks,colorlinks,linkcolor=black,citecolor=black,urlcolor=black]{hyperref} %生成pdf中的书签
\setboolean{printanswer}{true} %控制是否输出习题的答案

%-----------定义了题的解释文本-------------------
\newenvironment{explain}{\vspace{1cm}\noindent\textbf{\color{blue}%
		\ifdefstring{\ELEGANT@lang}{en}{Explain}{说明}\,
}}{\par}
%----------------------------------------------

\begin{document}
	
%-----------古典密码--------------------	
	\chapter{古典密码}
	\begin{Exercise}
		对一个英文txt文档实现凯撒加密，编译后的可执行程序名为caesar.exe，比如要对1.txt文件进行加密，执行"caesar -e 1.txt 1e.txt",其中-e表示加密，1.txt是要加密的文件，1e.txt是指定的加密后将信息写入的文件。如果要对1e.txt解密，执行"caesar -d 1e.txt 1.txt"，其中-d表示解密，1e.txt是要解密的文件，1.txt是解密后的文件。程序在gitee上有初始仓库，在要求时间前发送pull request。程序编写完后写一个报告，报告内容包括，摘要，目标、设计、测试、总结，此报告上传到gitee上，上传的报告必需是pdf格式！\par
		\vspace{0.5cm}
		项目参考初始仓库\url{https://gitee.com/buuer/caesarcipher}\par
		提交的仓库中，要将文件message.txt中的内容进行加密，密文以文本方式存储在ciphers.txt中，同时将ciphers.txt进行解密，解密后得到的明文以文本方式存储在decode.txt中。
		
	\end{Exercise}

	\begin{explain}
		\begin{itemize}
			\item 首先要考虑一个正常的txt文档中，除了包括字母，还要由标点符号，而算法只能处理字母，所以输入的txt文档要进行预处理，以某种规则去掉不能处理的字符，然后进行加密。\textbf{为了便于统一评判，我们要求在预处理时，将大写字母转换为小写字母，其他字符都不变，加密时只对小写字母进行加密。}
			\item 由于对原始文档进行了预处理，所以解密后的文档与原始文档不是完全一样的。
			\item 提交的文档为PDF格式。
			\item 建议对所有学生的此实验报告进行认真打磨，反复修改，直到符合要求，通过这个过程使得学生掌握此类文档的书写要求，掌握基本科技类文档的写作技能，在此课程的后续文档编写中，学生能够顺利输出合乎规范的文档。
			\item 在gitee上创建项目：caesarcipher，并且将学生做为观察者加入，项目描述为：“对一个纯英文的txt文件，利用凯撒加密方法进行加解密，由于其只能处理字母，所以要对txt文件进行预处理，然后进行加解密，解密后的文件与原始的不同，这是正确的，而且由于预处理时有信息丢失，所以也不可能还原到原始文件。”,学生做为观察者的原因时限制学生权限，以免其误操作修改项目中原始文件，学生完成后，向指导教师发起pull requet，教师可以去其仓库下载其实验内容，实验内容除了代码，可执行程序，还需包含实验报告。
			
		\end{itemize}
	\end{explain}

	\begin{Exercise}
		对一个中文txt文档，利用古典加密的思想，设计一个加密方式对其进行加密，可以参考凯撒加密的方法，编译后的可执行程序名为hancipher.exe，比如要对1.txt文件进行加密，执行"hancipher -e 1.txt 1e.txt",其中-e表示加密，1.txt是要加密的文件，1e.txt是指定的加密后将信息写入的文件。如果要对1e.txt解密，执行"hancipher -d 1e.txt 1.txt"，其中-d表示解密，1e.txt是要解密的文件，1.txt是解密后的文件。程序在gitee上有初始仓库，在要求时间前发送pull request。\textbf{此练习不需要写报告}，但是需要在源代码中有清晰和足够的中文注释，并在项目的readme.txt文件中写出你所采用的加解密基本原理。
		\par
		\vspace{0.5cm}
		项目参考初始仓库\url{https://gitee.com/buuer/hancipher}\par
		提交的仓库中，要将文件plain.txt中的内容进行加密，密文以文本方式存储在ciphers.txt中，同时将ciphers.txt进行解密，解密后得到的明文以文本方式存储在decode.txt中。
		
	\end{Exercise}


%-----------流密码--------------------

\chapter{流密码}
	\begin{Exercise}
		编程实现流加密算法，其密钥由32位LFSR生成。算法对一个文本文件进行加密，加密后的信息存在二进制文件中，也可对加密后的二进制文件进行解密，解密后的明文存在以文本方式存入文件，执行命令时，用户可以指定涉及到的文件名。文件seed是存储种子值的二进制文件。\textbf{此练习不需要写报告}。\par
		例如:\\
		加密执行的命令: streamcipher -e 1.txt seed c1\\
		解密执行的命令: streamcipher -d c1 seed 2.txt
		\par
		\vspace{0.5cm}
		项目参考初始仓库\url{https://gitee.com/buuer/streamcipher}。\par
		文件seed是一个二进制文件，存的是种子值，初始仓库给的种子值为AAAA。\par
		提交的仓库中，要将文件plain\_buu\_intr.docx进行加密，密文以二进制方式存储在cipher.docx中，同时将cipher.docx\footnote{此时文件已经不能被Word应用程序正常打卡。}进行解密，解密后存为文件decode.docx\footnote{此时文件可以被Word应用程序正常打卡。}。
	\end{Exercise}
	\begin{explain}
		\begin{itemize}
			\item 密钥是什么？本原多项是什么(抽头序列是什么？Fibonacci配置是什么？)，可以查阅相关材料。
			\item 由于docx文件是一个结构性文档，也就是说是一个二进制文档，需要Word应用程序来解释的，所以当你加密是出现错误很难调整。建议在编写程序调试时，可以使用一个纯文本文档来调试，并且在调试过程中可以构造你需要的原文内容。
		\end{itemize}
	\end{explain}

	
%-----------分组密码--------------------
\chapter{分组密码}
	\begin{Exercise}
		编程实现DES加解密算法，工作模式为ECB模式，填充模式，请选择一种填充模式做为加密时的缺省填充模式。编写算法实现说明文档。算法实现后用命令行的方式运行。
		\par
		例如:\\
		加密执行的命令: descipher -e 1.txt key c1\\
		解密执行的命令: descipher -d c1 key 2.txt\\
		其中：key是保存密钥的二进制文件，c1是密文二进制文件，1.txt是原文的txt文件，2.txt是解密后原文文本文件。
		\par
		\vspace{0.5cm}
		项目参考初始仓库\url{https://gitee.com/buuer/descipher}\par
		用给出的文档模板编写的算法实现说明文档，文档要转换为pdf上传。\par
		提交的仓库中，要将文件plain\_buu\_intr.docx进行加密，密文以二进制方式存储在cipher.docx中，同时将cipher.docx\footnote{此时文件已经不能被Word应用程序正常打卡。}进行解密，解密后存为文件decode.docx\footnote{此时文件可以被Word应用程序正常打卡。}。
	\end{Exercise}

%	\begin{Exercise}
%		编程实现TDES(Triple DES)加解密算法。
%	\end{Exercise}

	
%-----------公钥密码--------------------
\chapter{公钥密码}
	\begin{Exercise}
		用GNU MP库，实现512位RSA加解密算法。\textbf{此练习不需要写报告}。
		\par
		例如:\\
		密钥生成：rsacipher -keygen pkey skey \\
		加密执行的命令: rsacipher -e 1.txt pkey c1\\
		解密执行的命令: rsacipher -d c1 skey 2.txt\\
		其中：pkey是保存公钥的文件，skey是保存私钥的文件，c1是密文二进制文件，1.txt是原文的txt文件，2.txt是解密后原文文本文件。
		\par
		\vspace{0.5cm}
		项目参考初始仓库\url{https://gitee.com/buuer/rsacipher}\par
		提交的仓库中，要将文件plain\_buu\_intr.docx进行加密，密文以二进制方式存储在cipher.docx中，同时将cipher.docx\footnote{此时文件已经不能被Word应用程序正常打卡。}进行解密，解密后存为文件decode.docx\footnote{此时文件可以被Word应用程序正常打卡。}。\par
	\end{Exercise}
	
	\begin{explain}
		\begin{itemize}
			\item 既然pkey和skey是命令参数，这就意味这存储公私要的文件名，你是可以自己定义的。
			\item 在公私钥文件中，存的不是一个数，而应该是两个数，所以存储格式你自己要明确，否则，读就是个问题。
			\item n怎么确定？你可以参考\url{https://blog.csdn.net/chengqiuming/article/details/82725708}。
			\item 更完整、安全的方法，可以查阅NIST 的SP 800-56,FIPS 186-4等系列标准。密钥产生是个很重要的问题，所以NIST对其有一系列的标准涉及到。
			\item 在所有密码算法实现中，随机数是一个非常重要的基础部件，GNU MP库提供了大伪随机数产生的算法。
			\item 在实现此算法中，可以直接利用GNU MP库中已有的算法，比如用GCD进行互素判定、mpz\_probab\_prime\_p进行素性判断等。
		\end{itemize}
	\end{explain}


%-----------哈希函数--------------------
\chapter{哈希函数}
	\begin{Exercise}
		编程实现MD5算法，参考RFC1321，生成的hash值用16进制的数的表述方式写到你指定的一个txt文件中。并用一个常用的软件对计算结果对比，以此来说明你算法实现的正确性，可以使用openssl，或者windows中的certutil等等。程序编写完成后，要编写算法实现说明文档，将此文档的pdf格式上传到你的gitee仓库中。
		\par
		例如:\\
		生成摘要：md5hash file1 1.txt \par
		
		其中：file1文件中的内容是要生成摘要的内容，1.txt文件时一个文本文件，file1文件摘要的16进制形式的表述写到这个文件中。
		\par
		\vspace{0.5cm}
		项目参考初始仓库\url{https://gitee.com/buuer/md5-hash}\par
		在提交时，digest.txt存储的是对plain\_buu\_intr.docx中的内容做哈希计算后结果的16进制数的表示。也就是说，如果计算出来的摘要二进制是“0100 0010 1000 1111”，那么在digest.txt中就以文本方式存储的是“428F”。\par
		
	\end{Exercise}


%------应用练习
\chapter{证书生成及应用实验——利用证书进行安全邮件通信}

\section{工具}

OpenSSL

\section{提供的信息}

我们事先利用OpenSSL生成了Buu的CA私钥和证书，私钥在实际使用中需要严格保密(\textbf{最高机密})。
Buu的CA证书buucacert.cer，已发布在QQ群文件夹“证书发布目录”。
Buu的私钥文件buucakey.pem，我们通过微信群发给大家，我们暂且认为这是个\textbf{“安全信道”}。
指导老师的证书lxf.cer，也已发布在QQ群文件夹“证书发布目录”。\par

\section{任务}

首先你“扮演”CA的工作人员，为客户(现在就是你自己)生成一个私钥和证书，然后你要通过安全的方式将私钥交给客户，将客户的证书发布在QQ群文件夹“证书发布目录”中，证书文件用客户名字命名（汉语）。\par
特别要注意的是，你给客户需要需要生成公私钥信息的PKCS\#12文件，在实验中使用。\par

利用支持公钥签名和加密的email客户端（例如：Thunderbird），给指导老师发布一个签名邮件和加密邮件。指导老师邮箱：xxtxiaofeng@buu.edu.cn 。\par

\textbf{注：生成证书时，序列号要随机生成，上一届有些同学使用的是同一个序列号，那么老师在导入证书时，会出现冲突，如果出现这种情况，老师会把冲突的学生叫到一起，具体看看是什么原因，并且会适当扣分。}

\subsection{签名邮件格式要求}

说明：下文中的***表示发邮件人的姓名，???表示日期。\par

邮件主题：签名邮件(***)\par

邮件正文：\par

这是我的第一封签名邮件，真的是我发的。\par
\vspace{2em}
**\par
???\par

\subsection{加密邮件格式要求}

说明：下文中的***表示发邮件人的姓名，???表示日期。\par

邮件主题：加密邮件(***)\par

邮件正文：\par

这是我的第一封加密邮件，你看到了吗？\par
\vspace{2em}
***\par
???\par

\section{评价}
此练习评价不使用编程类练习评价标准，只是看最终结果，是否能正确地收到你的加密、签名邮件，以及文件格式是否按照要求的格式。

%密码学CTF
\chapter{密码学CTF练习}
此部分题目来源于\url{https://buuoj.cn}。此练习的评价不使用编程类练习的评价标准，按照你提交的writeup进行评分。

\section{Alice与Bob}
密码学历史中，有两位知名的杰出人物，Alice和Bob。他们的爱情经过置换和轮加密也难以混淆，即使是没有身份认证也可以知根知底。就像在数学王国中的素数一样，孤傲又热情。下面是一个大整数:98554799767,请分解为两个素数，分解后，小的放前面，大的放后面，合成一个新的数字，进行md5的32位小写哈希，提交答案。 

\textsl{注意：得到的 flag 请包上 flag{} 提交。}

\section{MD5}
e00cf25ad42683b3df678c61f42c6bda

\section{RSA}
在一次RSA密钥对生成中，假设p=473398607161，q=4511491，e=17


求解出d作为flga提交

\section{RSA1}
p = 8637633767257008567099653486541091171320491509433615447539\\
162437911244175885667806398411790524083553445158113502227745206\\
205327690939504032994699902053229 
\par
q = 12640674973996472769176047937170883420927050821480010581593137\\
1353724738805956137373376306297525773461470392840300825934907766\\
30572584959954205336880228469 
\par
dp = 65007957022168346211090423511932615306500438410562529\\
3093094966335862501688183284072806602615026469307610935487\\
4099841380454881716097778307268116910582929 
\par
dq = 78347226367355344901953258038647067238057403355130388913\\
7911760438881683674556098098256795673512201963002175438762767\\
516968043599582527539160811120550041 
\par
c = 247223054038873820735673164676490806626315529059602293\\
9907910799560215441817605633580063888752761416407353043765\\
7085079676157350205351945222989351316076486573599576041978\\
3398722659250627643185360890073102702785261596789374319038\\
6289240074791552511898395997060793414297473667578432599344\\
5942031372107342103852
\par

\section{rsarsa}
Math is cool! Use the RSA algorithm to decode the secret message, c, p, q, and e are parameters for the RSA algorithm.
\par

p =  964842302901051567659055174001042653494573763923573\\
98006439893520398525072984913995610350091634270503701075\\
70733633350911691280297777160200625281665378483
\par
q =  11874843837980297032092405848653656852760910154543380907\\
6500401907042833589092085782510630477324439922306479038875100\\
65547947313543299303261986053486569407
\par
e =  65537
\par
c =  83208298995174604174773590298203639360540024871256126892889\\
6613457424033149298619391004926666056473166465764865262174570063\\
7684228086972858172674640158370589994176821413874225968933484073\\
5633553053887641847651173776251820293087212885670180367406807406\\
765923638973161375817392737747832762751690104423869019034
\par
Use RSA to find the secret message

\newpage

\section{丢失的MD5}
md5.py内容为：
\begin{lstlisting}[language=Python,title={md5.py}]
	import hashlib   
	for i in range(32,127):
      for j in range(32,127):
         for k in range(32,127):
            m=hashlib.md5()
            m.update('TASC'+chr(i)+'O3RJMV'+chr(j)+'WDJKX'+chr(k)+'ZM')
            des=m.hexdigest()
            if 'e9032' in des and 'da' in des and '911513' in des:
                print des
\end{lstlisting}
%-------编程练习评判标准
\chapter{编程类练习参考评分标准}
\section{编程类练习评分标准(有报告)}
\subsection{设计考虑}
通过此类练习希望学生能够通过应用掌握一些工程工具，如此课程中的git和流程图的绘制软件及绘制方法。\par
另外希望学生能够进一步熟练使用C语言进行编程，提高使用C语言的能力。\par
学生能够理解已有的密码算法，并能够用C语言实现。\par
学生能够利用GMP大数据库编写算法，具备初步利用第三方库的能力，同时可以利用他设计并实现一些底层的数学算法。\par
通过编写规范的技术文档，基本掌握此类文档的编制方法。

\subsection{参考评分标准}
每次代码评分总分，如果没有按时提交为0分，没有按时提交，但是有合理理由，并被老师接受，为了体现公平，其评分总分为此次按时交作业中的最低分，最后得分将按其实际总分等比例获得.\par
每次代码评分总分为60分，评分规则为：
\begin{itemize}
	\item CR(code running):代码运行情况，共35分，细则为：
	\begin{itemize}
		\item 无提交0分.
		\item 能按要求正确运行并且在验证执行中没有错误，35——30分；
		\item 能按要求正确运行但在验证执行中有一些错误，不影响获得正确结果，30——25分；
		\item 基本能够按照要求运行，运行中有错误，但可以获得正确的主要结果，25——20分.
		\item 可以运行，无法获得正确结果，20——15分.
		\item 有可执行程序，但无法运行，获得合理解释，15——0分.
	\end{itemize}
	\item DQ(document qualification):文档文字描述，共15分，细则为：
	\begin{itemize}
		\item DQ-1文档中有文字描述.无0分，有5分.
		\item DQ-2文字描述质量.简练清晰5分,把框架或功能准确描述出来3，描述混乱0.
		\item DQ-3有框架或功能流程图.无0分，不满足规范或者不准确3分，满足规范且准确5分。
	\end{itemize}
	\item TC(test cases):测试用例，共10分，细则为：
	\begin{itemize}
		\item TC-1测试用例。无0分，有但是描述不规范3分，有且描述规范5分.
		\item TC-2测试用例设计。覆盖全面功能且考虑全面5分，覆盖全部功能但考虑不全面主要内容3，未覆盖全面功能且考虑欠缺0分。
	\end{itemize}
\end{itemize}

\section{编程类练习评分标准(无报告)}
此类练习只需要提交源代和编译后的代码到gitee上即可。\par
评价依据是，如果没有按时提交为0分，没有按时提交，但是有合理理由，并被老师接受，为了体现公平，其评分总分为此次按时交作业中的最低分，最后得分将按其实际总分等比例获得.\par
代码评分总分为50分，评分规则为：
\begin{itemize}
	\item CR(code running):代码运行情况，共35分，细则为：
	\begin{itemize}
		\item 无提交0分.
		\item 能按要求正确运行并且在验证执行中没有错误，35——30分；
		\item 能按要求正确运行但在验证执行中有一些错误，不影响获得正确结果，30——25分；
		\item 基本能够按照要求运行，运行中有错误，但可以获得正确的主要结果，25——20分.
		\item 可以运行，无法获得正确结果，20——15分.
		\item 有可执行程序，但无法运行，获得合理解释，15——0分.
	\end{itemize}
	\item EN(explanatory note)，共15分，细则为：
	\begin{itemize}
		\item EN-1无注释.无0分，有5分.
		\item EN-2通过注释能很好阅读代码，注释简练清晰全面10-15分；通过注释不能很好阅读代码(比如注释不全面等问题)，5-10分
	\end{itemize}
	
\end{itemize}



\end{document}